home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / text.tex < prev    next >
Text File  |  1993-01-28  |  14KB  |  466 lines

  1. % Text.tex copyright 1992 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%% Text Blocks
  4.  
  5. \@GenericConstruct{TextBlock}
  6.  
  7. % commands can be before and after text
  8. % store in two token lists
  9. % switch from one to other by option 'text'
  10. % this may also be used by ParagraphShape
  11. %
  12. \add@TextBlock@default{
  13.     \def\@current@options@list{before@coms}
  14.     \def\switch@lists{\at@breakpointyes
  15.         \def\@current@options@list{after@coms}}
  16.     }
  17. \@TextBlockOption{text}{\switch@lists}
  18.  
  19. \def\@DefineTextBlock{
  20.     \csarg\edef{\@name}{\@gen@open
  21.         \the\before@coms
  22.         }
  23.     \@DefineStopCommand{\the\after@coms \@gen@close}
  24.     }
  25.  
  26.     
  27.  
  28. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  29. %%%%% A L I N E A V O R M E N
  30. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  31. % via \everypar:
  32. % \everypar={\@everyeverypar { ...locaal spul...
  33. %                              \def\par{... \@par\egroup}
  34. \@GenericConstruct{ParagraphShape}
  35.  
  36. %%%%!!!!!!!!!!!!!!!!
  37. % not functioning.
  38. % note: \@defaulteverypar is installed now
  39. % as a start@command!
  40.  
  41. %% anonieme namen
  42. % \iftempa : moet dit inspringen
  43. % \iftempb : speciale behandeling staart?
  44.  
  45. \def\@ParagraphShapeverstekwaardes{
  46.     \tempano \tempbno
  47.     \temptoksb={} \temptoksc={}
  48.     \def\cs@d{b}\def\@current@options@list{temptoks\cs@d}
  49.     }
  50. \def\@DefineParagraphShape{
  51.     \csarg{\edef}{\@name}{%
  52.           \CSname{AltijdInspringen\iftempa yes\else no\fi}%
  53.           \nxp\everypar={\nxp\@everyeverypar
  54.               \iftempb \bgroup \fi
  55.               \the\temptoksb 
  56.               \iftempb \parfillskip\z@ 
  57.                   \else \if@erislinkswit \parfillskip\z@ \fi\fi
  58.               \relax
  59.               \iftempb \def\nxp\par{\nxp\unskip\nxp\nobreak\the\temptoksc 
  60.                                   \hbox{}\nxp\@par\egroup}\fi
  61.          }}              }
  62.  
  63. \@ParagraphShapeNOOP{verticaal}
  64.  
  65. %-- inspringen
  66. \@ParagraphShapeOption{inspringen}{
  67.     \if\EqualString{#1}{no}\else\tempayes\fi}
  68.  
  69. %-- tekst
  70. \@ParagraphShapeOption{tekst}{\tempbyes\def\cs@d{c}}
  71.  
  72.  
  73. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  74. %%%%%%%%%%%%%%%% U T I L I T I E S
  75. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  76.  
  77. %%%%%%%%%%%%%%%% Space, white space
  78. %
  79. % unit space \@@space is set by switching font style
  80. %
  81. \newdimen\@@space \@@space=.5em
  82. \def\Spaces:#1 {\hskip#1\@@space}
  83.  
  84. % handig voor bibliografieen
  85. \def\lax{\tolerance\@m \hfuzz\p@}
  86.  
  87.  
  88. %%%%%%%%%%%%%%%%%%%%%%%
  89. % White space
  90. %
  91. \NewTrace:skip
  92.  
  93. \def\hwhite:#1 {\@hwhite{#1}}
  94. \def\@hwhite#1{\ifhmode\unskip\fi\relax 
  95.     \if\EqualString{#1}{fillup}\hfill\else\hskip\@ww{#1}\relax\fi}
  96.  
  97. % Vertical
  98. % subtle: argument should be placed even if
  99. % size is equal: stretch may be different,
  100. % probably more. (cf \par\vwit{0pt plus 1fil} )
  101. %
  102. \def\vwhite:#1 {\@vwhite{#1}}
  103. \@GenericOption{vwhite}{\protect@breakpoint
  104.     \@add@toks{\@vwhite{#1}}\at@breakpointno}
  105. \def\@vwhite#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
  106.     \Tmessage[skip]{Considering vskip \the\tempskipa}%
  107.     \ifvmode \ifdim\tempskipb>\tempskipa
  108.              \Tmessage[skip]{Ignored. (lastskip=\the\tempskipb)}%
  109.           \else \Tmessage[skip]{Backvspacing \the\tempskipb}%
  110.              \vskip-\tempskipb 
  111.              \Tmessage[skip]{Vskip \the\tempskipa}%
  112.              \vskip\tempskipa \fi
  113.     \else \if\EqualString{#1}{fillup}\hfill
  114.           \else\vskip\tempskipa \fi
  115.     \fi}
  116.  
  117. % advance skip by literal or name of control sequence
  118. \def\advance@skip#1#2{\advance#1\@ww{#2}\relax}
  119.  
  120. % only backspace the previous; 
  121. % in this case prevent creating a breakpoint
  122. % if there was no glue
  123. %
  124. \def\bvwhite#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
  125.     \Tmessage[skip]{Clearing for vskip \the\tempskipa}%
  126.     \ifvmode \ifdim\lastskip>\tempskipa 
  127.         \else \ifdim\lastskip=\z@ 
  128.             \else \vskip-\tempskipb\relax 
  129.                   \Tmessage[skip]{Backspaced}\fi
  130.     \fi \fi}
  131. \def\unhskip{\ifhmode\unskip\fi}
  132. \def\leavehmode{\unvbox\voidb@x}
  133. \def\novbreak{\leavehmode\nobreak}
  134.  
  135. \def\white:#1 {\@white{#1}}
  136. \@GenericOption{white}{\protect@breakpoint
  137.     \@add@toks{\@white{#1}}\at@breakpointyes}
  138. \def\@white#1{\ifhmode\@hwhite{#1}\else
  139.     \ifvmode\@vwhite{#1}\fi\fi}
  140. \def\fillup{\@white{0pt plus1fill}}
  141.  
  142. \def\@@distance#1{\csarg\newskip{#1}}
  143. \def\Distance:#1=#2
  144.    {\if\UndefinedCS{#1}\@@distance{#1}\fi
  145.     \edef\cs@e{\global\noexpand\set@value{#1}%
  146.                \if\UndefinedCS{#2}{#2}%
  147.                \else \CSname{#2}\fi}
  148.     \cs@e}
  149. \def\AdaptiveDistance:#1=#2 {\Distance:#1=#2
  150.     \adds@stop@command
  151.       {\ifWriteExtern\immediate\write\aux@file
  152.          {\string\Distance:#1={\xp\the\csn#1\ecs}}\fi
  153.          }}
  154.  
  155. \Distance:filler={0pt plus 1fil}
  156. \parindent=30pt
  157. \parskip=0pt
  158. \parfillskip=0cm plus 1 fil
  159. \baselineskip=12pt
  160.  
  161. %%%%%%%%%%%%%%%% Rules
  162. \@GenericOption{rule}{
  163.     \if\EqualString{#1}{h}\protect@breakpoint
  164.          \@add@toks{\hrule#2\relax}
  165.          \at@breakpointyes
  166.     \else\if\EqualString{#1}{v}\@add@toks{\vrule#2\relax}
  167.          \else\Wmessage{Strange option: <rule:#1=#2>}
  168.     \fi  \fi}
  169. \@GenericOption{hrule}{\protect@breakpoint
  170.     \@add@toks{\hrule}\at@breakpointyes}
  171. \@GenericOption{vrule}{\@add@toks{\vrule}}
  172.  
  173. %%%%%%%%%%%%%%%% Indentation Control
  174. % default value for all paragraphs set by AlwaysIndent
  175. % this one is set by by the user,
  176. % or by 'indentinside' option of paragraph shapes
  177. %
  178. \DefineTest:AlwaysIndent
  179. \AlwaysIndent:yes
  180.  
  181. % override by Indent
  182. % can be set by the user,
  183. % or by start/end of text constructs
  184. %
  185. \DefineTest:Indent       %forceer/onderdruk inspringen
  186.  
  187. % Remove indentation
  188. % this is executed by \every@everypar
  189. %
  190. \def\controlled@indentation
  191.    {\ifAlwaysIndent
  192.           \ifIndent \else \remove@indent \Indent:yes \fi
  193.     \else \ifIndent \Indent:no \else \remove@indent \fi
  194.     \fi}
  195. \def\remove@indent{{\setbox0=\lastbox}}
  196.  
  197. \def\noindentation{\AlwaysIndentno \Indentno}
  198.  
  199. % Indentation control in Universal Block
  200. % control sequences \first@indent \inside@indent \after@indent
  201. % are called (in \edef context) in general open/close macros
  202. % for universal environments
  203.  
  204. % Indent after this block
  205. % \global because the block may be in a further group
  206. %
  207. \add@generic@default{\def\after@indent{\global\nxp\Indent:no }}
  208. \@GenericOption{indentafter}{
  209.     \def\after@indent{\global\nxp\Indent:#1 }}
  210.  
  211. % Indent in this block
  212. \add@generic@default{\def\inside@indent{}}
  213. \@GenericOption{indentinside}{
  214.     \def\inside@indent{\nxp\AlwaysIndent:#1 }}
  215.  
  216. % Indent first in this block
  217. \add@generic@default{\def\first@indent{\nxp\Indent:no }}
  218. \@GenericOption{indentfirst}{
  219.     \def\first@indent{\nxp\Indent:#1 }}
  220.  
  221. %%%% Level dependent indentation
  222. %
  223. \NewTrace:indent
  224.  
  225. % Lots of commands and parameters
  226. %
  227. % \levelindent is the indentation that will be taken
  228. %    on the current level, jumping to the next
  229. %
  230. \newdimen\levelindent 
  231.  
  232. % \previousindent is the indentation that got us to this level
  233. %    list item labels have to outdent over this amount
  234. %
  235. \newdimen\previousindent \previousindent\z@
  236.  
  237. % indentlevel counter: used to generate automatic indentation,
  238. %    for instance \levelindentvi for level vi
  239. %
  240. \new@@counter{indentlevel}
  241. \set@counter{indentlevel}1
  242.  
  243. % \set@level@indent : set \levelindent to automatically
  244. %    generated indentation; if \levelindentiii is defined take it,
  245. %    otherwise use \@@level@indent{3}, which uses fraction
  246. %    of a \basicindent
  247. %
  248. \def\set@level@indent{\levelindent=
  249.     \level@indent{\cs@counter@name{indentlevel}}}
  250. \def\level@indent
  251.  #1{\if\UndefinedCS{\@level@indent{#1}}\@@level@indent{#1}%
  252.     \else \csname \@level@indent{#1}\endcsname \fi}
  253. \def\@level@indent#1{levelindent\romannumeral#1}
  254. \def\@@level@indent#1{\ifcase#1\z@\or
  255.  \basicindent \or .75\basicindent \else .5\basicindent \fi}
  256.  
  257. \DefineTest:BasicIndentIsSet
  258. % the following lines appear as the last command in \Start,
  259. % so that the user can tinker with \parindent
  260. % through adaptive distances or in the style
  261. %\ifBasicIndentIsSet\else\Distance:basicindent=parindent\fi
  262. %\set@level@indent
  263.  
  264. % \SetLevelIndent : set exact amount of indentation for
  265. %    specific level
  266. %
  267. \def\LevelIndent:#1=#2 {\csarg\edef{\@level@indent{#1}}{\@ww{#2}}}
  268.  
  269. % Push/Pop indentlevels
  270. %
  271. \def\PushIndentLevel
  272.    {\Tmessage[indent]{Old indent: \the\leftskip}%
  273.     \advance\leftskip\levelindent 
  274.     \previousindent=\levelindent
  275.     \step@counter{indentlevel}\set@level@indent
  276.     \Tmessage[indent]{New indent: \the\leftskip, 
  277.                       at level \the\cs@counter@name{indentlevel}}%
  278.     }
  279.  
  280. % Popping an indent level requires two pops: one for the \levelindent
  281. % and one for the \previousindent. This last one then has to be 
  282. % pushed again.
  283. %
  284. \def\PopIndentLevel
  285.    {\ifnum\cs@counter@name{indentlevel}=\@ne
  286.         \Emessage{Pop indent level attempted at outer level}
  287.     \else \back@step@counter{indentlevel}%
  288.         \back@step@counter{indentlevel}%
  289.         \set@level@indent \previousindent\levelindent
  290.         \step@counter{indentlevel}%
  291.         \set@level@indent\advance\leftskip-\levelindent
  292.     \fi}
  293.  
  294. %%%%%%%%%%%%%%%% Paragraph Skip control
  295. % parskip is stored and set to zero at the start and end
  296. % of environments
  297. \newskip\@restoreparskip 
  298.  
  299. % it is recorded if a parskip has been stored
  300. %
  301. \newif\if@parskipsaved \@parskipsavedno
  302.  
  303. % Do no parskip
  304. % used at start of environment
  305. %
  306. \def\hold@parskip
  307.    {\@restoreparskip\parskip \parskip\z@ \@parskipsavedyes}
  308.  
  309. % Hold off parskip
  310. % used at end of environment
  311. %
  312. \def\dono@parskip{\if@parskipsaved \else \hold@parskip \fi}
  313.  
  314. % Reestablish the parskip
  315. % this is executed in \every@everypar
  316. %
  317. \def\controlled@parskip
  318.    {\if@parskipsaved \@parskipsavedno 
  319.         \parskip\@restoreparskip
  320.     \fi}
  321.  
  322. \def\noparskip{\parskip\z@ \@restoreparskip\z@}
  323.  
  324. %%%%%%%%%%%%%%%% Every Paragraph
  325. % \everypar is supposed to contain \every@everypar
  326. % as its first element.
  327. %
  328. \def\every@everypar{\controlled@indentation \controlled@parskip
  329.     \one@shot@coms \@headedno}
  330. \def\default@everypar{\everypar={\every@everypar}}
  331. \add@start@command{\default@everypar}
  332. \everypar{\Emessage{You forgot to give the \nxp\Start\@space command.}}
  333.  
  334. % Execute once
  335. %
  336. \newtoks\one@shot@toks
  337. \def\one@shot@coms{\temptoksa\one@shot@toks 
  338.     \global\one@shot@toks={}\the\temptoksa\temptoksa{}}
  339. \def\next@paragraph#1{\append@to@list{one@shot@toks}{#1}}
  340.  
  341. %%%%%%%%%%%%%%%% Every Math
  342. % just like \everypar.
  343. %
  344. \newtoks\every@everymath \newcount\high@fam
  345. \every@everymath{\high@fam\count18\relax
  346.     %\MainFace
  347.     \xp\math@setsize\style@sizes}
  348. \everymath{\the\every@everymath}
  349. \everydisplay{\the\every@everymath}
  350.  
  351. % Flush margins
  352. %
  353. \Distance:rightmarginstretch={0pt plus 6cm}
  354. \Distance:leftmarginstretch={0pt plus 6cm}
  355. \def\FlushLeft:#1 {\switch {\if\EqualString{#1}}
  356.     {yes} {\leftskip=1\leftskip}
  357.     {default} {\leftskip=1\leftskip
  358.                \advance\leftskip\leftmarginstretch}
  359.     \endswitch \relax}
  360. \FlushLeft:yes
  361. \def\FlushRight:#1 {\switch {\if\EqualString{#1}}
  362.     {yes} {\rightskip=1\rightskip}
  363.     {default} {\rightskip=1\rightskip
  364.                \advance\rightskip\rightmarginstretch}
  365.     \endswitch \relax}
  366. \FlushRight:yes
  367.  
  368. %%%%%%% lijn
  369. % #1 : hoogte; #2 : lengte; #3 : elevatie
  370. % parameters kunnen van achter af aan weggelaten worden;
  371. % #4 is dummy, kan niet door de gebruiker gespecificeerd worden.
  372. % NNNNNNNNNBBBBBBBBBBBBB: #2 werkt nog niet!!!!!!!!!!!!
  373. \newtoks\@lijntoks
  374. \@lijntoks={}
  375.  
  376. % Lijn. Hier moet ik nog eens naar kijken.
  377. \@GenericOption{lijn}{
  378.     \edef\cs@e{\nxp\lijnanalyse:#1:\@restarg::::;}\cs@e
  379.     \edef\cs@e{\nxp\@add@toks{\nxp\leavevmode\the\@lijntoks}}
  380.     \cs@e}
  381.  
  382. \def\lijnanalyse:#1:#2:#3:#4;{\@lijntoks={}
  383.     \eqstring{#1}{}{}{\achteraanlijst{@lijntoks}{height #1 }}
  384.     \eqstring{#2}{}{\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
  385.                     \achteraanlijst{@lijntoks}{\hfill}}%
  386.                    {\eqstring{#2}{uitvullen}%
  387.                     {\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
  388.                      \achteraanlijst{@lijntoks}{\hfill}}%
  389.                     {\achteraanlijst{@lijntoks}{width \w@w{#2} }%
  390.                      \vooraanlijst{@lijntoks}{\vrule depth 0cm }}
  391. %    \eqstring{#3}{}{}{\vooraanlijst{@lijntoks}{\raise #3\hbox\bgroup}
  392. %                      \achteraanlijst{@lijntoks}{\egroup}}
  393.                    }
  394.     \achteraanlijst{@lijntoks}{\hbox{}} % \par doet \unskip!!!
  395.     }
  396.     
  397.  
  398. %%%%%%%%%%%%%%%%%%%%%%%%%%% accenten
  399. \gdef\allowhyphens{\penalty\@M \hskip\z@\relax}
  400.  
  401. {\catcode`\"=12 \gdef\hex{"}}
  402.  
  403. \catcode`\"=13
  404. \def "#1{\ifx#1i\discretionary{-}{i}{{\accent'177 \i}}%
  405.     \else\ifx#1-\allowhyphens-\penalty\z@\allowhyphens
  406.     \else\ifx#1"\hskip\z@\relax
  407.     \else\ifx#1!\hex
  408.     \else\ifx#1|\allowhyphens
  409.     \else {\accent'177 #1}\fi\fi\fi\fi\fi}
  410.       
  411. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
  412. %%%%%%%%%%%%%%%%%% C A S E
  413. %% 
  414. \def\UpperCase#1{\edef\cs@a{\uppercase{#1}}\cs@a}
  415.  
  416. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  417. %%%%%%%%%%% L E T T E R S P A C I N G
  418. %% 
  419. \def\LetterSpace
  420.    {\ifnextchar[\@LetterSpace %] <- to fool emacs
  421.                {\@LetterSpace[0ptplus1fil]}}
  422. \def\@LetterSpace[#1]#2{\def\@LS{\hskip#1\relax}%
  423.     \edef\cs@e{#2}\xp\@@LS\cs@e&}
  424. \def\@@LS#1#2&{#1\ifEmpty{#2}\xp\take@one\else\@LS\xp\@@LS\fi#2&}
  425.  
  426. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  427. %%%%%%%%%%%%%%% Interdictions
  428. %% 
  429. \def\NoHyphenation{\hyphenpenalty\@M \exhyphenpenalty\@M}
  430. \def\NoWidows{\widowpenalty\@M}
  431. \def\NoOrphans{\clubpenalty\@M}
  432.  
  433. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
  434. %%%%%%%%%%%%%%%%%% V E R B A T I M
  435. %% 
  436.  
  437. \def\setupverbatim{\let\do=\makeother \dospecials}
  438.  
  439. %% inline verbatim
  440. \def\ver{\leavevmode\begingroup \setupverbatim \obeyspaces\tt \@ver}
  441. \def\@ver#1{\def\@@ver##1#1{##1\endgroup}\@@ver}
  442.  
  443. %% display verbatim
  444. {\activecr %
  445.  \gdef\vVer>{\setupverbatim \obeyspaces %
  446.       \tt \parindent\z@ \noparskip \obeylines %
  447.       \ifnextchar
  448.       \@@Ver\@Ver}\noeol %
  449.  \gdef\@Ver#1<Rev{#1\VerStop}%
  450.  \gdef\@@Ver
  451.     #1<Rev{#1\VerStop}}
  452.  
  453. %% verbatim files
  454. \def\verbatimfile#1{\begingroup
  455.     \setupverbatim \obeyspaces \parindent\z@ \noparskip \obeylines %
  456.     \tt \input#1\relax
  457.     \endgroup}
  458.  
  459. \endinput
  460.  
  461. 92/11/08 white options created;
  462.      breakpoint protection in white options
  463. 92/11/18 AdaptiveDistance implemented
  464. 92/11/20 \set@counter calls updated for \w@w use
  465. 92/12/14 default flush right
  466.